\documentclass{article}

\usepackage{xltxtra}
\usepackage{fontspec}
\setmainfont{WenQuanYi Zen Hei Mono}
\usepackage{geometry}
\geometry{left=2cm,right=6cm,top=2cm,bottom=2cm}

\begin{document}

\title{设计思路及测试说明}
\author{3220100159 梁越}
\date{\today}

\maketitle

\section{设计思路}
    实现四则运算，我们输入的
    式子是中缀表达式，计算时
    要考虑运算顺序。但将其转
    化为后缀表达式后，从左往
    右计算即可。所以，第一步
    ：实现中缀到后缀的转换。
\subsection{中缀转后缀}
    （我将转换作为主函数的一
    部分。）由于stack和queue
    的特性，用queue存储后缀
    表达式，用stack存储运算
    符。首先，读入数字时，依
    次读入即可，遇到小数点时
    ，需确保只有一个小数点（
    利用bool flag）。当遇到
    回车，标志输入结束，遇到
    制表符直接忽略即可。重点
    在运算符，+-运算优先度最
    低，即应放到所有运算符最
    后，*/ 、（）则应较前，
    所以遇到（）时应清除所有
    运算级低于他的，最终再删
    去左括号。*/同理。
    然后，为了实现计算，声明
    了函数calculate。
\subsection{计算}
    由于主函数中用户输入的是
    字符串，而函数计算需要的
    是数字，所以要先进行字符
    串到数字的转换。使用
    stack，将后缀表达式中的
    ‘0’-‘9’字符转为数字。但
    如果我们不对中缀转后缀的
    函数做其他任何处理，将有
    可能出现 12.33.4+，而这
    样直接转换的函数实现是非
    常困难的，所以我在中缀转
    后缀时，一旦遇到运算符，
    就会压入一个空格到quene
    中，以实现数字的分离，
    但这种方法我们并不能
    保证每个数字后都有空格，
    所以我们将运算符和空格
    均看作读入数字的标志，
    一旦遇到，就进行
    con.push(num)。
    这时我们又要考虑1+2-3到
    1 2 +3-的情况，这会导致
    读数时多读一个num=0进去
    ，为了避免这种情况，且当
    数字被读入我们本就会使
    num归零从而实现下一个
    数字符号到数字的转换，那
    么直接将num=0视作标志，若
    num=0,说明刚刚已经读入了
    数字，不应再读入。另外，
    由于小数点的存在，我用i
    代替小数位数，当读到小数
    点时，flag=true，此时，
    i++，同时结束一个数字读
    入，要同时将num，i以及
    flag归到初始状态。读到运
    算符时，使用switch直接
    计算即可，当所有的元素
    遍历，函数中的stack只剩
    一个元素，及计算结果，
    反之则报错。同样对于
    1（（2这样的式子，并
    无法实现中后缀转换，
    那么我们在calculate函数中
    增加一种情况，若读到空格、
    运算符以外的任意符号，均
    报错且退出。
\subsection{最终实现}
    最终，在主函数中引用calc
    ulate函数，计算exp，因为
    输出exp时，会不断循环弹
    出第一个元素直至exp为空，
    所以新建一个queue，存储
    exp内的元素，最终用刚刚
    定义的函数计算结果。
\section{测试说明}
   从整数的四则运算到浮点数
   的无括号四则运算，到有括
   号的四则运算，到多重括号
   的四则运算，中间加入字母
   等干扰，以及括号不对称时
   的运算是否报错测试程序，
   来验证中缀转后缀时数字是
   否正确存储，运算符先后次
   序是否正确，以及输入其他
   符号是否能够进行等。最终
   应为正确的中缀表达式正常
   转换为后缀表达式并计算，
   若是有括号不匹配的情形报
   错，若有仅有左括号的情形
   在最后计算时报错，有字母
   等直接忽略。
\end{document}
